App 在要跟後端 API 請求資料的等待時間過久,對使用者來說是很有感的,這篇將介紹如何優化網路請求的效能。
在與後端 API 請求資料時,不要自已用較底層的HttpURLConnection
。直接使用專門處理 API 的 Open source 函式庫,例如 Retrofit 或是 Apollo,能加快網路請求速度。
我們就來介紹 Retrofit 這個套件用來跟後端 API 取得料。
首先加入 dependencies
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
implementation 'com.squareup.okhttp3:logging-interceptor:4.0.1'
這個範例我們想透過這個 API 網址來取得資料,而回傳的資料如下。
網址:https://jsonplaceholder.typicode.com/todos/1
回傳 Json:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
首先針對每一個 Request 建立 interface。
interface ApiService {
@GET("todos/{id}")
fun getTodo(@Path("id") id: Int): Call<TodosResponse>
}
建立回傳 Json 的資料模型。
data class TodosResponse(
val userId: Int,
val id: Int,
val title: String,
val completed: Boolean
)
新增類別 AppClientManager,在這裡實作 Retrofit 的連線功能。
class AppClientManager private constructor() {
private val retrofit: Retrofit
init {
val okHttpClient = OkHttpClient().newBuilder()
.build()
retrofit = Retrofit.Builder()
.baseUrl(Config.URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
}
companion object {
private val manager = AppClientManager()
val client: Retrofit
get() = manager.retrofit
}
}
接著透過 AppClientManager 去呼叫 getTodo(1)
就可以取得回傳的 TodosResponse 了。
private fun callAPI() {
val apiService = AppClientManager.client.create(ApiService::class.java)
apiService.getTodo(1).enqueue(object : Callback<TodosResponse> {
override fun onResponse(call: Call<TodosResponse>, response: Response<TodosResponse>) {
println("response:$response")
}
override fun onFailure(call: Call<TodosResponse>, t: Throwable) {
println("onFailure:$t")
}
})
}
這樣就完成了透過 Retrofit 請求 API 資源,使用上非常方便,效能也會比自已使用HttpURLConnection
來得好。
如果網路請求的時間仍是過長,在 App 建立 Cache 也是提升效能的方式,尤其是網路圖片的載入,直接使用像 Glide 這種載入圖片的函式庫,載入速度快且支援 Cache 功能。
網路請求的效能問題不見得是 App 的問題,一個網路的請求有可能是慢在後端的資料庫查詢,所以後端 API 如果有 Cache 對於效能也能有所提升。我們在後續會有一篇介紹在處理效能優化處理,你應該懂得尋求協助,不管是向後端或是設計尋求協助,因為效能不只是 App 開發人員的事。
下一篇將接著介紹如何使用 Internet Inspector 來監看網路的使用狀況。